GtkWidget: Add margin-start and margin-end properties
authorYosef Or Boczko <yoseforb@gmail.com>
Mon, 28 Oct 2013 20:56:00 +0000 (22:56 +0200)
committerBenjamin Otte <otte@redhat.com>
Thu, 14 Nov 2013 20:55:50 +0000 (21:55 +0100)
Add margin-{start,end} and gtk_widget_{get,set}_margin_{start,end}
and drop margin-{left,right} and gtk_widget_{get,set}_margin_{left,right}.

margin-{start,end} handle right also in RTL.

https://bugzilla.gnome.org/show_bug.cgi?id=710238

docs/reference/gtk/gtk3-sections.txt
gtk/gtkwidget.c
gtk/gtkwidget.h

index cc56f00267ec4253fa873c2f23ae3e8b744ffa14..5a9eec151e467307e4c5797068fb7598ce80f82f 100644 (file)
@@ -5502,6 +5502,10 @@ gtk_widget_get_margin_left
 gtk_widget_set_margin_left
 gtk_widget_get_margin_right
 gtk_widget_set_margin_right
+gtk_widget_get_margin_start
+gtk_widget_set_margin_start
+gtk_widget_get_margin_end
+gtk_widget_set_margin_end
 gtk_widget_get_margin_top
 gtk_widget_set_margin_top
 gtk_widget_get_margin_bottom
index 25f7bd4d5ce2c1475840e649531e6a1a3df7c346..c984db0e3ec6d1408aeff6988f0fbfc354e74478 100644 (file)
@@ -631,6 +631,8 @@ enum {
   PROP_VALIGN,
   PROP_MARGIN_LEFT,
   PROP_MARGIN_RIGHT,
+  PROP_MARGIN_START,
+  PROP_MARGIN_END,
   PROP_MARGIN_TOP,
   PROP_MARGIN_BOTTOM,
   PROP_MARGIN,
@@ -1412,6 +1414,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
    * request, the margin will be added in addition to the size from
    * gtk_widget_set_size_request() for example.
    *
+   * Deprecated: 3.12. Use #GtkWidget:margin-start instead.
+   *
    * Since: 3.0
    */
   g_object_class_install_property (gobject_class,
@@ -1433,6 +1437,8 @@ G_GNUC_END_IGNORE_DEPRECATIONS
    * request, the margin will be added in addition to the size from
    * gtk_widget_set_size_request() for example.
    *
+   * Deprecated: 3.12. Use #GtkWidget:margin-end instead.
+   *
    * Since: 3.0
    */
   g_object_class_install_property (gobject_class,
@@ -1445,6 +1451,48 @@ G_GNUC_END_IGNORE_DEPRECATIONS
                                                      0,
                                                      GTK_PARAM_READWRITE));
 
+  /**
+   * GtkWidget:margin-start:
+   *
+   * Margin on start of widget.
+   *
+   * This property adds margin outside of the widget's normal size
+   * request, the margin will be added in addition to the size from
+   * gtk_widget_set_size_request() for example.
+   *
+   * Since: 3.12
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN_LEFT,
+                                   g_param_spec_int ("margin-start",
+                                                     P_("Margin on Start"),
+                                                     P_("Pixels of extra space on the start"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
+  /**
+   * GtkWidget:margin-end:
+   *
+   * Margin on end of widget.
+   *
+   * This property adds margin outside of the widget's normal size
+   * request, the margin will be added in addition to the size from
+   * gtk_widget_set_size_request() for example.
+   *
+   * Since: 3.12
+   */
+  g_object_class_install_property (gobject_class,
+                                   PROP_MARGIN_RIGHT,
+                                   g_param_spec_int ("margin-end",
+                                                     P_("Margin on End"),
+                                                     P_("Pixels of extra space on the end"),
+                                                     0,
+                                                     G_MAXINT16,
+                                                     0,
+                                                     GTK_PARAM_READWRITE));
+
   /**
    * GtkWidget:margin-top:
    *
@@ -3721,6 +3769,12 @@ gtk_widget_set_property (GObject         *object,
     case PROP_MARGIN_RIGHT:
       gtk_widget_set_margin_right (widget, g_value_get_int (value));
       break;
+    case PROP_MARGIN_START:
+      gtk_widget_set_margin_start (widget, g_value_get_int (value));
+      break;
+    case PROP_MARGIN_END:
+      gtk_widget_set_margin_end (widget, g_value_get_int (value));
+      break;
     case PROP_MARGIN_TOP:
       gtk_widget_set_margin_top (widget, g_value_get_int (value));
       break;
@@ -3729,8 +3783,8 @@ gtk_widget_set_property (GObject         *object,
       break;
     case PROP_MARGIN:
       g_object_freeze_notify (G_OBJECT (widget));
-      gtk_widget_set_margin_left (widget, g_value_get_int (value));
-      gtk_widget_set_margin_right (widget, g_value_get_int (value));
+      gtk_widget_set_margin_start (widget, g_value_get_int (value));
+      gtk_widget_set_margin_end (widget, g_value_get_int (value));
       gtk_widget_set_margin_top (widget, g_value_get_int (value));
       gtk_widget_set_margin_bottom (widget, g_value_get_int (value));
       g_object_thaw_notify (G_OBJECT (widget));
@@ -14026,18 +14080,22 @@ gtk_widget_set_margin_left (GtkWidget *widget,
                             gint       margin)
 {
   GtkWidgetAuxInfo *aux_info;
+  gboolean rtl;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (margin <= G_MAXINT16);
 
   aux_info = gtk_widget_get_aux_info (widget, TRUE);
 
+  rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
+
   if (aux_info->margin.left == margin)
     return;
 
   aux_info->margin.left = margin;
   gtk_widget_queue_resize (widget);
   g_object_notify (G_OBJECT (widget), "margin-left");
+  g_object_notify (G_OBJECT (widget), rtl ? "margin-end" : "margin-start");
 }
 
 /**
@@ -14073,18 +14131,150 @@ gtk_widget_set_margin_right (GtkWidget *widget,
                              gint       margin)
 {
   GtkWidgetAuxInfo *aux_info;
+  gboolean rtl;
 
   g_return_if_fail (GTK_IS_WIDGET (widget));
   g_return_if_fail (margin <= G_MAXINT16);
 
   aux_info = gtk_widget_get_aux_info (widget, TRUE);
 
+  rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
+
   if (aux_info->margin.right == margin)
     return;
 
   aux_info->margin.right = margin;
   gtk_widget_queue_resize (widget);
   g_object_notify (G_OBJECT (widget), "margin-right");
+  g_object_notify (G_OBJECT (widget), rtl ? "margin-start" : "margin-end");
+}
+
+/**
+ * gtk_widget_get_margin_start:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:margin-start property.
+ *
+ * Returns: The start margin of @widget
+ *
+ * Since: 3.12
+ */
+gint
+gtk_widget_get_margin_start (GtkWidget *widget)
+{
+  const GtkWidgetAuxInfo *aux_info;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
+
+  if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
+    return aux_info->margin.right;
+  else
+    return aux_info->margin.left;
+}
+
+/**
+ * gtk_widget_set_margin_start:
+ * @widget: a #GtkWidget
+ * @margin: the start margin
+ *
+ * Sets the start margin of @widget.
+ * See the #GtkWidget:margin-start property.
+ *
+ * Since: 3.12
+ */
+void
+gtk_widget_set_margin_start (GtkWidget *widget,
+                             gint       margin)
+{
+  GtkWidgetAuxInfo *aux_info;
+  gint16 *start;
+  gboolean rtl;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (margin <= G_MAXINT16);
+
+  aux_info = gtk_widget_get_aux_info (widget, TRUE);
+
+  rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
+
+  if (rtl)
+    start = &aux_info->margin.right;
+  else
+    start = &aux_info->margin.left;
+
+  if (*start == margin)
+    return;
+
+  *start = margin;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "margin-start");
+  g_object_notify (G_OBJECT (widget), rtl ? "margin-right" : "margin-left");
+}
+
+/**
+ * gtk_widget_get_margin_end:
+ * @widget: a #GtkWidget
+ *
+ * Gets the value of the #GtkWidget:margin-end property.
+ *
+ * Returns: The end margin of @widget
+ *
+ * Since: 3.12
+ */
+gint
+gtk_widget_get_margin_end (GtkWidget *widget)
+{
+  const GtkWidgetAuxInfo *aux_info;
+
+  g_return_val_if_fail (GTK_IS_WIDGET (widget), 0);
+
+  aux_info = _gtk_widget_get_aux_info_or_defaults (widget);
+
+  if (gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL)
+    return aux_info->margin.left;
+  else
+    return aux_info->margin.right;
+}
+
+/**
+ * gtk_widget_set_margin_end:
+ * @widget: a #GtkWidget
+ * @margin: the end margin
+ *
+ * Sets the end margin of @widget.
+ * See the #GtkWidget:margin-end property.
+ *
+ * Since: 3.12
+ */
+void
+gtk_widget_set_margin_end (GtkWidget *widget,
+                           gint       margin)
+{
+  GtkWidgetAuxInfo *aux_info;
+  gint16 *end;
+  gboolean rtl;
+
+  g_return_if_fail (GTK_IS_WIDGET (widget));
+  g_return_if_fail (margin <= G_MAXINT16);
+
+  aux_info = gtk_widget_get_aux_info (widget, TRUE);
+
+  rtl = gtk_widget_get_direction (widget) == GTK_TEXT_DIR_RTL;
+
+  if (rtl)
+    end = &aux_info->margin.left;
+  else
+    end = &aux_info->margin.right;
+
+  if (*end == margin)
+    return;
+
+  *end = margin;
+  gtk_widget_queue_resize (widget);
+  g_object_notify (G_OBJECT (widget), "margin-end");
+  g_object_notify (G_OBJECT (widget), rtl ? "margin-left" : "margin-right");
 }
 
 /**
index 4c893c17032cc75c64de874721b8c4c8d2eda6f0..8c5df6a7312d8403963b5e881ab3afa5b002728b 100644 (file)
@@ -920,16 +920,26 @@ GtkAlign gtk_widget_get_valign_with_baseline (GtkWidget *widget);
 GDK_AVAILABLE_IN_ALL
 void     gtk_widget_set_valign        (GtkWidget *widget,
                                        GtkAlign   align);
-GDK_AVAILABLE_IN_ALL
+GDK_DEPRECATED_IN_3_12_FOR(gtk_widget_get_margin_start)
 gint     gtk_widget_get_margin_left   (GtkWidget *widget);
-GDK_AVAILABLE_IN_ALL
+GDK_DEPRECATED_IN_3_12_FOR(gtk_widget_set_margin_start)
 void     gtk_widget_set_margin_left   (GtkWidget *widget,
                                        gint       margin);
-GDK_AVAILABLE_IN_ALL
+GDK_DEPRECATED_IN_3_12_FOR(gtk_widget_get_margin_end)
 gint     gtk_widget_get_margin_right  (GtkWidget *widget);
-GDK_AVAILABLE_IN_ALL
+GDK_DEPRECATED_IN_3_12_FOR(gtk_widget_set_margin_end)
 void     gtk_widget_set_margin_right  (GtkWidget *widget,
                                        gint       margin);
+GDK_AVAILABLE_IN_3_12
+gint     gtk_widget_get_margin_start  (GtkWidget *widget);
+GDK_AVAILABLE_IN_3_12
+void     gtk_widget_set_margin_start  (GtkWidget *widget,
+                                       gint       margin);
+GDK_AVAILABLE_IN_3_12
+gint     gtk_widget_get_margin_end    (GtkWidget *widget);
+GDK_AVAILABLE_IN_3_12
+void     gtk_widget_set_margin_end    (GtkWidget *widget,
+                                       gint       margin);
 GDK_AVAILABLE_IN_ALL
 gint     gtk_widget_get_margin_top    (GtkWidget *widget);
 GDK_AVAILABLE_IN_ALL